#!/bin/bash
function tulosta_matriisi () { 
[[ ! $(eval echo \${$1[*]}) ]] && echo matriisi $1 on määrittelemätön && echo && return # esimerkiksi kirjoitusvirhe nimessä aiheuttaa tämän
(echo -n "Matriisin $1 jäsenten arvot    : "; eval echo -e \${$1[@]^^}          # ^^ muuttaa arvot suurille kirjaimille. Muuttaminen pienille kirjaimille olisi ,, 
echo -n "Matriisin $1 jäsenten osoitteet : "; eval echo \${!$1[*]}) | column -t # voi ne poiskin jättää
echo -n "Matriisin $1 jäsenienluku           :  "; eval echo  \${#$1[@]} 
echo
}

declare -A matriisi1 # Assosiatiivinen matriisi tarvitsee ilmoittaa, mutta tavallista matriisia ei tarvitse ilmoittaa, mutta jos sen haluaa ilmoittaa niin tuo parameri on -a
matriisi1[yksi]=ensimmäinen
matriisi1[kaksi]=toinen
matriisi1[kolme]=kolmas

matriisi2[7]=2  # matriisin jäsenien osoitteiden ei tarvitse alkaa nollasta ja osoitteet voivat pomppiakin eikä muistia kulu väliin jääneisiin osoitteisiin. Myöskään
matriisi2[4]=1  # matriisin jäseniä ei tarvitse antaa järjestyksessä ja silti ne tulevat tulosteeseen järjestyksessä.
matriisi2[123]=3
matriisi2[334455]=4

matriisi3=(minä, sinä, '"Hentun Liisa"', '"Puntun Paavo"', '"Kapakka Lassi"' ja '"Mylläri Matti"' montako meittiä oli?)
# mikäli matriisin jäsenessä on välilyöntejä on jäsenen molemmin ouolin laitettava lainausmerkki. Se kyllä hieman sekoittaa tulostetta. 
# mikäli vielä halutaan ne tulosteeseen selvästi erotettuina täytyy käyttää kovan- ja pehmeän lainausmerkin yhdistelmää 

matriisi4=({a..z})

tulosta_matriisi matriisi1
tulosta_matriisi matriisi2
tulosta_matriisi matriisi3
tulosta_matriisi matriisi4

# tässä on kaksi tehtävää ja voit tarkastella niiden suorittamista poistamalla kommentit neljästä tämän lohkon viimeisestä lauseesta ja kommentoimalla viimeisen lohkon
# 1.matriisin tiettyjen jäsenien tekeminen määrittelemättömiksi ja tulostaminen - kiinnitä huomiosi osoitteisiin
# 2.määrittelemien jäsenien poistaminen ja tulostaminen taas - kiinnitä taas huomiosi taas osoitteisiin 
#for ((i=0; i<=9; i++)); do unset "matriisi4[$i]"; done
#tulosta_matriisi matriisi4
#matriisi4=( "${matriisi4[@]}" ) # matriisin jäsenten uudelleen numerointi siten, että ensimmäisen jäsenen osoite on 0 ja seuraavien jäsenten osoitteet aina 1 suurempi
#tulosta_matriisi matriisi4

# tämä vastaa noita neljää edellistä kommentoitua lausetta; työ on pakko suorittaa näin muissa kielissä sillä sparse tyyppistä matriisia ei niissä ole.  
# BASH:_issa sensijaan voi tehdä kummin vain.
matriisi4=("${matriisi4[@]:9:25}") # siis vain arvot 9-25 otetaan ja osoitteet uudelleen-numeroidaan samalla
tulosta_matriisi matriisi4
tulosta_matriisi matriisi5
